using System;
using System.Collections.Generic;
using Core;
using UnityEngine;

namespace Modules.UI.Main
{
    /// <summary>
    /// 画布管理器类，负责管理UI页面的创建、获取和删除。
    /// </summary>
    public class MainCanvas : GameSubsystem
    {
        // 存储当前所有页面的列表
        private readonly List<MainPage> _pages = new List<MainPage>(); // 页面列表

        // private const string PageStoreName = "GuidePageStore"; // 页面存储文件名
        private MainPageStore _mainPageStore; // 页面存储对象

        protected override void Awake()
        {
            base.Awake();
            _mainPageStore = Resources.Load<MainPageStore>(nameof(MainPageStore));
            DontDestroyOnLoad(this);
        }

        /// <summary>
        /// 获取指定类型的页面，如果不存在则创建新的页面。
        /// </summary>
        /// <typeparam name="T">页面类型，必须是Page的子类。</typeparam>
        /// <returns>返回页面实例。如果页面已存在，则返回现有实例；否则，创建并返回新实例。</returns>
        public T LoadPage<T>() where T : MainPage
        {
            MainPage mainPage = _pages.Find(p => p.GetType() == typeof(T));
            if (mainPage != null)
                return mainPage as T;

            T pagePrefab = _mainPageStore.Get<T>();
            if (pagePrefab == null)
                throw new NullReferenceException($"Can not find the page prefab of type {typeof(T)}.");
            // 创建并添加新页面
            return (T)LoadPage(pagePrefab);
        }

        /// <summary>
        /// 创建并添加一个页面。
        /// </summary>
        /// <param name="mainPage"> 要创建的页面实例。</param>
        /// <returns> 返回创建的页面实例。</returns>
        private MainPage LoadPage(MainPage mainPage)
        {
            // 实例化页面
            MainPage mainPageInstance = Instantiate(mainPage, transform);

            // 确定页面的插入顺序
            int orderIndex = _pages.Count;
            for (int i = 0; i < _pages.Count; i++)
            {
                if (mainPageInstance.Order >= _pages[i].Order)
                    continue;
                orderIndex = i;
                break;
            }

            // 设置页面在父级中的顺序
            mainPageInstance.transform.SetSiblingIndex(_pages.Count - orderIndex);
            // 在页面列表中插入新页面
            _pages.Insert(orderIndex, mainPageInstance);
            return mainPageInstance;
        }


        /// <summary>
        /// 移除指定的页面并销毁其游戏对象。
        /// </summary>
        /// <param name="mainPage">要移除的页面实例。</param>
        public void UnloadPage(MainPage mainPage)
        {
            // 从页面列表中移除页面并销毁其游戏对象
            if (_pages.Remove(mainPage))
            {
                Destroy(mainPage.gameObject);
            }
        }

        public void UnloadPage(Type type)
        {
            // 检查类型是否是MainPage或其派生类
            if (!typeof(MainPage).IsAssignableFrom(type)) return;
            // 查找并移除指定类型的页面
            MainPage page = _pages.Find(p => p.GetType() == type);
            if (page == null) return;
            _pages.Remove(page);
            Destroy(page.gameObject);
        }

    }
}